import java.awt.*;
import java.util.*;
/**
 * La clase DataCategory sirve como base para las
 * distintas categorías de datos proporcionando un modelo
 * a seguir y algunos métodos de utilidad.
 */
public abstract class DataCategory implements DataConst
{
    /**
     * Inicializa los datos con los valores proporcionados.
     * @param id identificador del dato o comando.
     * @param value el valor inicial respectivo.
     * @return verdadero si el dato pertenece a esta 
     * categoria y falso en otro caso.
     */    
    public abstract boolean initData(int id,int value);
    public abstract boolean initData(int id,long value);
    /**
     * Proporciona los componentes destinados para el marco 
     * superior, los cuales comúnmente solo muestran información 
     * y no son editables. Por lo general, se trata de una
     * lámina que contiene un grupo de componentes que se 
     * relacionan según el tipo de información que muestran.
     * @param viewID identificador del componente
     * @return un componente donde se visualiza información, el
     * cual sera una lámina en la mayoria de los casos.
     */
    public abstract Component getView(Id viewID);
    /**
     * Proporciona los componentes destinados para el marco 
     * inferior, los cuales comunmente seran bótones, controles o
     * campos editables. Por lo general, se trata en su mayoría 
     * de una lámina que contiene un grupo de componentes que se 
     * relacionan segun el tipo de información que administran.
     * @param editorID identificador del componente
     * @return un componente con controles o campos editables, el
     * cual sera una lámina en la mayoria de los casos.
     */
    public abstract Component getEditor(Id editorID);
    /**
     * Proporciona una cadena de texto que identifica la categoría.
     * @return una cadena de texto de identificación..
     */
    public abstract String getDataCategoryID();
    /**
     * Proporciona el valor del dato correspondiente al 
     * argumento identificador en forma de cadena de texto.
     * @param dataID identificador del dato
     * @return una cadena de texto que representa el valor.
     */
    public abstract String getValue(Id dataID);
    /**
     * Establece nuevos valores de comandos, generados 
     * por controles del teclado.
     * @param id identificador del comando
     * @param value nuevo valor asignado
     * @return verdadero si el dato pertenece a esta 
     * categoria y falso en otro caso.
     */
    public abstract boolean setCommandValue(int id,int value);
    public abstract boolean setCommandValue(int id,long value);
    /**
     * Establece nuevos valores de datos.
     * @param id identificador del dato.
     * @param value el nuevo valor asignado.
     * @return verdadero si el dato pertenece a esta 
     * categoria y falso en otro caso.
     */
    public abstract boolean setDataValue(int id,int value);
    public abstract boolean setDataValue(int id,long value);
    /**
     * Confirma cambios hechos en controles editables.
     */
    public abstract void applyChange();
    /**
     * Cancela cambios hechos en controles editables.
     */
    public abstract void cancelChange();
    /**
     * Convierte una cantidad de milímetros o pulgadas a nanómetros.
     * @param metricSystem dependiendo si su Valor es "international"
     * o "english" determina si la cantidad se encuentra en milímetros 
     * o pulgadas.
     * @para value valor a convertir en nanómetros
     * @return un número entero que contiene los nanómetros equvalentes.
     */
    /*public int toNm(String metricSystem,float value)
    {
        if(metricSystem.equals("international"))
            return NewComp.mmToNm(value);
        else
            return NewComp.inToNm(value);
    }*/
    public long toNm(String metricSystem,float value)
    {
        if(metricSystem.equals("international"))
            return NewComp.mmToNm(value);
        else
            return NewComp.inToNm(value);
    }
    /**
     * Convierte una cantidad de nanómetros a milímetros o pulgadas.
     * @param metricSystem dependiendo si su valor es "international"
     * o "english" determina si la cantidad se convierte a milímetros 
     * o pulgadas.
     * @param value valor en nanómetros a convertir en milímetros o pulgadas.
     * @return un número entero representando los milímetros o pulgadas
     * equivalentes.
     */
    public float toMmOrIn(String metricSystem,int value)
    {
        if(metricSystem.equals("international"))
            return NewComp.nmToMm(value);
        else
            return NewComp.nmToIn(value);
    }
    public float toMmOrIn(String metricSystem,long value)
    {
        if(metricSystem.equals("international"))
            return NewComp.nmToMm(value);
        else
            return NewComp.nmToIn(value);
    }
    /**
     * Lista de los campos editados y estan por confirmar o 
     * cancelar.
     */
    protected ArrayList<Id> changed = new ArrayList<Id>(10);
    public static final long MAX_UINT_32 = 4294967295L;
    public static final int MAX_UINT_16 = 65535;
    public static final short MAX_UINT_8 = 255;
}